/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package laboratory;

import ejb.archive.Report;
import ejb.archive.ReportFacadeRemote;
import ejb.laboratory.Validazione;
import ejb.laboratory.ValidazioneFacadeRemote;
import ejb.warehouse.Prodotto;
import ejb.warehouse.ProdottoFacadeRemote;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import javax.naming.NamingException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import java.sql.Connection;
import java.sql.DriverManager;
import java.util.*;
import javax.servlet.ServletOutputStream;

import org.apache.struts.actions.DispatchAction;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.ActionForward;
import system.LoginActionForm;
import system.Utilities;


import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.DocumentBuilder;
import org.w3c.dom.Document;
import org.w3c.dom.NodeList;
import org.w3c.dom.Node;
import org.w3c.dom.Element;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;

import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import net.sf.jasperreports.engine.*;
import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource;
import org.apache.struts.actions.DownloadAction.FileStreamInfo;
import org.apache.struts.actions.DownloadAction.StreamInfo;

 
import org.w3c.dom.Attr;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;

/**
 *
 * @author ciummo
 */
public class ValidateAction extends DispatchAction {

    /*
     * forward name="success" path=""
     */
    private final static String SUCCESS = "success";

    private final static String SUCCESSRETRIEVEVALIDATORS = "successRetrieveValidators";
    
    private final static String SUCCESSVALIDATE = "successValidate";
    private final static String PRODUCTREADY = "productReady";
    
    private final static String GOTODOWNLOAD = "goToDownload";
    
    private final static String VIEWCHECK = "viewCheck";
    
    private final static String ADMINDIALOG = "Admin Dialog";
    private final static String USERDIALOG = "Tecnico Dialog";
    
    
    private Utilities utility = new Utilities();
    
    public static final String DATE_FORMAT_NOW = "yyyy-MM-dd";
    private Calendar cal = Calendar.getInstance();
    private SimpleDateFormat sdf = new SimpleDateFormat(DATE_FORMAT_NOW);
    
     public ActionForward validateProduct(ActionMapping mapping, ActionForm form,
            HttpServletRequest request, HttpServletResponse response)
            throws Exception {
        
                String serialProduct;
                        
                try{        
                        
                    serialProduct = request.getParameter("serialeProdotto").toString();
                }catch (NullPointerException npe){
                                    
                    serialProduct = request.getSession().getAttribute("serialeProdotto").toString();
                }

                
                //TODO : Trasformarlo in form!
                ValidCheckActionForm validateForm = new ValidCheckActionForm();
                
                ValidazioneFacadeRemote validazioneFacade = (ValidazioneFacadeRemote) utility.callRemoteBean("ValidazioneFacade/remote");
                        
                List <Validazione> validazioni = validazioneFacade.findValidazioniFromSerialeProdotto(serialProduct);

                ProdottoFacadeRemote prodottoFacade = (ProdottoFacadeRemote) utility.callRemoteBean("ProdottoFacade/remote");
                
                Prodotto prodotto = prodottoFacade.find(serialProduct);
                
                for (int i = 0; i<validazioni.size(); i++){
                    
                    
                    // Se c'è almeno una validazione da fare...
                    if (validazioni.get(i).getValore().equalsIgnoreCase("false")){
                        
                        validateForm.setListValidator(validazioni);
                        request.getSession().setAttribute("ValidCheckActionForm", validateForm);
                        request.getSession().setAttribute("serialeProdotto", serialProduct);
                        
                        
                        prodotto.setStato("In Verifica");

                        prodottoFacade.edit(prodotto);

                        return mapping.findForward(SUCCESSRETRIEVEVALIDATORS);
                        
                    }
                }
                
                //Il prodotto è ora da validare (solo se non era gia' pronto)            
                
                
                if(prodotto.getStato()!="Pronto"){
                
                    prodotto.setStato("Da Validare");

                    prodottoFacade.edit(prodotto);
                    
                    ////////////////////////REPORT//////////////////////////////////////
            
                    ReportFacadeRemote reportFacade = (ReportFacadeRemote) utility.callRemoteBean("ReportFacade/remote");
                    Report report = new Report();

                    report.setCodRiferimento(serialProduct);
                    report.setData(sdf.format(cal.getTime()));

                    LoginActionForm loginForm = (LoginActionForm) request.getSession().getAttribute("LoginActionForm"); 
                    report.setIdUtente(loginForm.getUsername());
                    report.setTipo("Prodotto da Validare");

                    reportFacade.create(report);

                    /////////**********************************/////////////////////////
                    
                    
                                        
                }
                validateForm.setListValidator(validazioni);
                request.getSession().setAttribute("ValidCheckActionForm", validateForm);
                request.getSession().setAttribute("serialeProdotto", serialProduct);

                
                if (utility.checkRole(request).equals(USERDIALOG)){
                
                    return mapping.findForward(SUCCESSRETRIEVEVALIDATORS);
                }
                
                
                return mapping.findForward(VIEWCHECK);
    }
    
    
    
    public ActionForward validate(ActionMapping mapping, ActionForm form,
            HttpServletRequest request, HttpServletResponse response)
            throws Exception {
        
        int serialProduct = Integer.parseInt(request.getParameter("idValidator"));
        
        ValidazioneFacadeRemote validazioneFacade = (ValidazioneFacadeRemote) utility.callRemoteBean("ValidazioneFacade/remote");
        
        Validazione validazione = validazioneFacade.find(serialProduct);
        
        
        
        
        
        synchronized (this){
            
            
            if(validazione.getValore().equalsIgnoreCase("true")){
                
                
                //TODO : aggiungerlo come messaggio
                System.out.println("errore di sincronizzazione! un altro utente ha già validato");
                //TODO AGGIUNGERE FORWARD
                return mapping.findForward(SUCCESSVALIDATE);
            }


            validazione.setData(sdf.format(cal.getTime()));
            
            validazione.setValore("true");
            
            LoginActionForm loginForm = (LoginActionForm) request.getSession().getAttribute("LoginActionForm"); 

            validazione.setIdUtente(loginForm.getUsername());

            validazioneFacade.edit(validazione);


            request.getSession().setAttribute("serialeProdotto", validazione.getSerialProdotto());
        }
        return mapping.findForward(SUCCESSVALIDATE);
    }

    
    
    public ActionForward unValidate(ActionMapping mapping, ActionForm form,
            HttpServletRequest request, HttpServletResponse response)
            throws Exception {
        
        
        
        String messaggio = request.getParameter("mess");
        
        
        ValidazioneFacadeRemote validazioneFacade = (ValidazioneFacadeRemote) utility.callRemoteBean("ValidazioneFacade/remote");
        
        Validazione validazioneOld = validazioneFacade.find(Integer.parseInt(request.getParameter("idValidazione")));
        
        
        synchronized (this){
            
            
            if(validazioneOld.getValore().equalsIgnoreCase("false")){
                
                
                //TODO : aggiungerlo come messaggio
                System.out.println("errore di sincronizzazione! un altro utente già de-validato");
                //TODO AGGIUNGERE FORWARD
                return mapping.findForward(SUCCESSVALIDATE);
            }

            
            Validazione validazioneNew = new Validazione();
            
            validazioneNew.setData(validazioneOld.getData());
            validazioneNew.setIdUtente(validazioneOld.getIdUtente());
            validazioneNew.setSerialProdotto(validazioneOld.getSerialProdotto());
            validazioneNew.setTesto(validazioneOld.getTesto());
            validazioneNew.setValore("invalidate");
            
            LoginActionForm loginForm = (LoginActionForm) request.getSession().getAttribute("LoginActionForm"); 

            
            
            
            validazioneNew.setNote("Utente: "+loginForm.getUsername()+" Data: "+sdf.format(cal.getTime())+" Mess: "+messaggio);
            

            validazioneOld.setData(null);
            validazioneOld.setValore("false");
            validazioneOld.setIdUtente(null);
            validazioneOld.setNote(null);


            validazioneFacade.edit(validazioneOld);
            validazioneFacade.create(validazioneNew);


            request.getSession().setAttribute("serialeProdotto", validazioneOld.getSerialProdotto());

        return mapping.findForward(SUCCESSVALIDATE);
        
        }    

    }
    
        public ActionForward validateFinal(ActionMapping mapping, ActionForm form,
            HttpServletRequest request, HttpServletResponse response)
            throws Exception {
            
            String serialProduct;
                        
                try{        
                        
                    serialProduct = request.getParameter("serialeProdotto").toString();
                }catch (NullPointerException npe){
                                    
                    serialProduct = request.getSession().getAttribute("serialeProdotto").toString();
                }
                
            ProdottoFacadeRemote prodottoFacade = (ProdottoFacadeRemote) utility.callRemoteBean("ProdottoFacade/remote");
            Prodotto prodotto = prodottoFacade.find(serialProduct);
            prodotto.setStato("Pronto");
            prodottoFacade.edit(prodotto);
            
            request.getSession().setAttribute("idOrderProduct", prodotto.getIdOrdineProdotto());
            
            ////////////////////////REPORT//////////////////////////////////////
            
            ReportFacadeRemote reportFacade = (ReportFacadeRemote) utility.callRemoteBean("ReportFacade/remote");
            Report report = new Report();
            
            report.setCodRiferimento(serialProduct);
            report.setData(sdf.format(cal.getTime()));
            
            LoginActionForm loginForm = (LoginActionForm) request.getSession().getAttribute("LoginActionForm"); 
            report.setIdUtente(loginForm.getUsername());
            report.setMessaggio(request.getParameter("mess").toString());
            report.setTipo("Prodotto Pronto");
            
            reportFacade.create(report);
            
            /////////**********************************/////////////////////////
            
            
            return mapping.findForward(PRODUCTREADY);
        }
        
        
        public ActionForward printCheckList(ActionMapping mapping, ActionForm form,
            HttpServletRequest request, HttpServletResponse response)
            throws Exception { 

            String seriale = request.getParameter("serialeProdotto");
            
            
            printCheck(seriale);
            
            
            

 
            /*
            FileInputStream stream=null;
            
              try {
                // Get the directory and iterate them to get file by file...
                File file = new File("report/checkasd.pdf");

                if (!file.exists()) {
                    //context.addMessage(new ErrorMessage("msg.file.notdownloaded"));
                    //context.setForwardName("failure");
                } else {
                    response.setContentType("application/octet-stream");
                    response.setHeader("Content-Disposition","attachment;filename=check.pdf");
                    stream = new FileInputStream(file);
                    response.setContentLength(stream.available());
                    OutputStream os = response.getOutputStream();      
                    os.close();
                    response.flushBuffer();
                }
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                if (stream != null) {
                    try {
                        stream.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }*/

            response.setContentType("application/octet-stream");
            response.setHeader("Content-Disposition","attachment;filename=check.pdf");
            
            //Thread.sleep(10000);
            
            try
            {

                FileInputStream inputStream = new FileInputStream(new File("report/check.pdf"));

                response.setHeader("Content-Disposition","attachment; filename=report/check.pdf");
                try {
                    int c;
                    while ((c = inputStream.read()) != -1) {
                    response.getWriter().write(c);
                    }
                } finally {
                    if (inputStream != null) 
                        inputStream.close();
                        response.getWriter().close();
                }
                
                /*
                ServletOutputStream out = response.getOutputStream();

                byte[] outputByte = new byte[4096];

                while(in.read(outputByte, 0, 4096) != -1){
                    out.write(outputByte, 0, 4096);
                }
                in.close();
                out.flush();
                out.close();
                */
                }catch(Exception e){
                    e.printStackTrace();
                }
            
            return mapping.findForward(GOTODOWNLOAD);
        }  
        
        
     public static void printCheck(String seriale) {
         
        Connection connection;
        JasperReport jasperReport;
        JasperPrint jasperPrint;
        
        try{
            
            Class.forName("com.mysql.jdbc.Driver");
            connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/DGestDB","root","password");
            jasperReport = JasperCompileManager.compileReport("report/checkList.jrxml");
            

            Map parameters = new HashMap();
            parameters.put("seriale", seriale);

            
            jasperPrint = JasperFillManager.fillReport(jasperReport, parameters, connection);
            
            
            JasperExportManager.exportReportToPdfFile(jasperPrint, "report/check.pdf");

        }catch(Exception ex){
            ex.printStackTrace();
        }
    }
}

